package com.ruoyi.system.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;
@Component
public class RedisRateLimiterWithBlacklistWhitelist {

    @Value("${iplimiter.time_window}")
    private int TIME_WINDOW;  // 时间窗口（秒）
    @Value("${iplimiter.request_limit}")
    private int REQUEST_LIMIT; // 最大请求数
    @Value("${iplimiter.blacklist_duration}")
    private int BLACKLIST_DURATION; // 黑名单封禁时间（秒）



    @Autowired
    private  RedisTemplate<Object, Object> redisTemplate;




    public RedisRateLimiterWithBlacklistWhitelist()  {
    }

    /**
     * 检查是否允许访问
     */
    public boolean isAllowed(String ip) {


        // 检查黑名单
//        if (isInBlacklist(ip)) {
//            System.out.println("IP " + ip + " 是在黑名单中");
//            return false; // 黑名单直接拒绝
//        }

        // 限流逻辑
        String key = "rate_limit:" + ip;

        Long count = redisTemplate.opsForValue().increment(key);
        if (count == 1) {
            // 设置时间窗口
            redisTemplate.expire(key, TIME_WINDOW, TimeUnit.SECONDS);
        }

        if (count > REQUEST_LIMIT) {
            // 触发限流，将 IP 加入黑名单
            addToBlacklist(ip);
            return false;
        }

        return true;
    }

    /**
     * 添加到黑名单
     */
    public void addToBlacklist(String ip) {
        redisTemplate.opsForSet().add("blacklist", ip);
        redisTemplate.expire("blacklist", BLACKLIST_DURATION, TimeUnit.SECONDS);
        System.out.println("IP " + ip + " 已被添加到黑名单，并设置了过期时间 ");

    }

    /**
     * 检查是否在黑名单中
     */
    public boolean isInBlacklist(String ip) {
        return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember("blacklist", ip));
    }


}
